package com.iplay.实战java高并发程序设计.chapter2;

/**
 * volatile不能保证线程的安全性
 * @author dangwu
 * @since 2021/10/13 7:44 下午
 */
public class AccountingVol implements Runnable{
    static AccountingVol accountingVol = new AccountingVol();
    static volatile int i = 0;
    public static void increase(){
        i++;
    }
    @Override
    public void run() {
        for (int j=0; j<10000000; j++){
            increase();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(accountingVol);
        Thread t2 = new Thread(accountingVol);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        //原因是t1和t2同时读取i为0，并各自计算得到i=1，并先后写入这个结果，因此，虽然i++被执行了两次，但是实际i的值只增加了1.
        System.out.println(i);//11510719
    }
}
